#include "defaultpage.h"
#include "ui_defaultpage.h"
#include "stationandcitydelegate.h"
// DefaultPage类的构造函数实现
// 继承自QWidget类，接受一个父窗口指针作为参数
DefaultPage::DefaultPage(QWidget *parent)
    : QWidget(parent)  // 初始化基类QWidget，传入父窗口指针
    , ui(new Ui::DefaultPage)  // 初始化ui指针，创建DefaultPage的UI对象
{
    ui->setupUi(this);  // 设置UI界面，将this指针传递给setupUi函数
    //connect(ui->btn_onew_query,&QPushButton::clicked,this,)
    connect(ui->btn_onew_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_r_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_s_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_sell_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_ontime_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_chkp_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    connect(ui->btn_rf_query,&QPushButton::clicked,this,&DefaultPage::OnRequestForQuery);
    //InitComboBox();
}
void DefaultPage::InitStations(QJsonObject t){
    StationAndCityDelegate* p = new StationAndCityDelegate();
    ui->cmb_chkp_station->setItemDelegate(p);
    ui->cmb_onew_dst->setItemDelegate(p);
    ui->cmb_onew_src->setItemDelegate(p);
    ui->cmb_ot_sta->setItemDelegate(p);
    ui->cmb_r_dst->setItemDelegate(p);
    ui->cmb_r_src->setItemDelegate(p);
    ui->cmb_s_dst->setItemDelegate(p);
    ui->cmb_s_src->setItemDelegate(p);
    ui->cmb_sell_sellsta->setItemDelegate(p);
    QStringList stations,types;
    QJsonArray arr = t["data"].toArray();
    //QJsonArray tps = t["data"].toArray();
    for(int i=0;i<arr.size();i++){
        QJsonObject g = arr[i].toObject();
        stations.append(g["name"].toString());
        types.append(g["type"].toString());
    }
    for(int i=0;i<stations.size();i++){
        ui->cmb_onew_src->addItem(stations[i]);
        ui->cmb_onew_dst->addItem(stations[i]);
        ui->cmb_r_dst->addItem(stations[i]);
        ui->cmb_r_src->addItem(stations[i]);
        ui->cmb_s_dst->addItem(stations[i]);
        ui->cmb_s_src->addItem(stations[i]);
        ui->cmb_ot_sta->addItem(stations[i]);
        ui->cmb_chkp_station->addItem(stations[i]);
        ui->cmb_sell_sellsta->addItem(stations[i]);
        ui->cmb_onew_src->setItemData(i,types[i],StationTypeRole);
        ui->cmb_onew_dst->setItemData(i,types[i],StationTypeRole);
        ui->cmb_r_dst->setItemData(i,types[i],StationTypeRole);
        ui->cmb_r_src->setItemData(i,types[i],StationTypeRole);
        ui->cmb_s_dst->setItemData(i,types[i],StationTypeRole);
        ui->cmb_s_src->setItemData(i,types[i],StationTypeRole);
        ui->cmb_ot_sta->setItemData(i,types[i],StationTypeRole);
        ui->cmb_chkp_station->setItemData(i,types[i],StationTypeRole);
        ui->cmb_sell_sellsta->setItemData(i,types[i],StationTypeRole);
    }
}
void DefaultPage::InitCities(QJsonObject t){
    QJsonArray cit = t["data"].toArray();
    QStringList cities;
    for(int i=0;i<cit.size();i++){
        QString city =  cit[i].toString();
        cities.append(city);
    }
    ui->cmb_onew_src->addItems(cities);
    ui->cmb_onew_dst->addItems(cities);
}
DefaultPage::~DefaultPage()
{
    delete ui;
}
/**
 * @brief DefaultPage::RequestQueryOneWay 请求单程查询
 * @return 返回一个QueryPackage指针，包含单程查询所需的所有信息
 *
 * 该函数用于获取用户在界面上输入的单程查询信息，并封装成一个查询包对象返回。
 * 包括目的地、出发地、日期、角色类型和车辆类型等信息。
 */
QueryPackage* DefaultPage::RequestQueryOneWay(){
    // 获取用户选择的目的地
    QString dst = ui->cmb_onew_dst->currentText();
    // 获取用户选择的出发地
    QString src = ui->cmb_onew_src->currentText();
    // 获取用户选择的日期
    QDate dt = ui->dt_onew_time->date();
    // 判断用户选择的角色类型（学生/成人）
    Role rl = ui->chb_onew_stu->isChecked()?Role::student:Role::adult;
    // 判断用户选择的车辆类型（高速/普通）
    //Vehicle vt = ui->chb_onew_hspeed?Vehicle::HighSpeed:Vehicle::Normal;
    QList<Vehicle>vt;
    if(ui->chb_onew_hspeed->isChecked()){
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
    }else{
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
        vt.append(QuickFirstClass);
        vt.append(QuickSecondClass);
        vt.append(HardSeat);
        vt.append(SoftBed);
        vt.append(HardBed);
    }

    // 创建并返回一个OneWayQuery对象，包含所有查询信息
    QueryPackage* pg = new OneWayQuery(0,dst,src,dt,rl,vt);
    return pg;
}
/**
 * 默认页面的请求查询往返票功能函数
 * 该函数用于收集用户输入的往返票查询信息并创建相应的查询包
 *
 * @return QueryPackage* 返回一个包含查询信息的往返票查询包指针
 */
QueryPackage* DefaultPage::RequestQueryRound(){
    // 获取用户选择的目的地文本
    QString dst = ui->cmb_r_dst->currentText();
    // 获取用户选择的出发地文本
    QString src = ui->cmb_r_src->currentText();
    // 获取用户选择的出发日期
    QDate sdt = ui->dt_r_stot->date();
    // 获取用户选择的返回日期
    QDate rdt = ui->dt_r_rt->date();
    // 根据学生复选框状态确定角色类型
    Role rl = ui->chb_r_stu->isChecked()?Role::student:Role::adult;
    // 根据高速列车复选框状态确定车辆类型
    QList<Vehicle>vt;
    if(ui->chb_onew_hspeed->isChecked()){
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
    }else{
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
        vt.append(QuickFirstClass);
        vt.append(QuickSecondClass);
        vt.append(HardSeat);
        vt.append(SoftBed);
        vt.append(HardBed);
    }
    // 创建并返回一个往返票查询包对象
    QueryPackage* pg = new RoundTripQuery(0,dst,src,sdt,rdt,rl,vt);
    return pg;
}
/**
 * @brief DefaultPage类的请求查询转账方法
 *
 * 该方法用于创建一个转账查询的请求包，根据用户界面上的输入信息来构建查询参数
 *
 * @return QueryPackage* 返回一个包含查询参数的TranferQuery对象指针
 *
 * @note 该方法会从UI控件中获取以下信息：
 *       - 目的地(dst)
 *       - 出发地(src)
 *       - 出发日期(sdt)
 *       - 用户角色(rl)
 *       - 车辆类型(vt)
 */
QueryPackage* DefaultPage::RequestQueryTranfer(){
    // 获取用户界面上的目的地下拉框当前选中的文本
    QString dst = ui->cmb_s_dst->currentText();
    // 获取用户界面上的出发地下拉框当前选中的文本
    QString src = ui->cmb_s_src->currentText();
    // 获取用户界面上的出发日期选择器所选中的日期
    QDate sdt = ui->dt_s_stot->date();
    // 获取用户界面上的到达日期选择器所选中的日期(当前被注释掉)
    //QDate rdt = ui->dt_r_rt->date();
    // 根据学生复选框是否选中来决定用户角色为学生或成人
    Role rl = ui->chb_s_stu->isChecked()?Role::student:Role::adult;
    // 根据高速列车复选框是否选中来决定车辆类型为高速或普通
    QList<Vehicle>vt;
    if(ui->chb_onew_hspeed->isChecked()){
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
    }else{
        vt.append(HighFirstClass);
        vt.append(HighSecondClass);
        vt.append(QuickFirstClass);
        vt.append(QuickSecondClass);
        vt.append(HardSeat);
        vt.append(SoftBed);
        vt.append(HardBed);
    }
    // 创建一个新的TranferQuery对象，传入所有收集到的参数
    QueryPackage* pg = new TranferQuery(0,dst,src,sdt,rl,vt);
    // 返回创建的查询包对象指针
    return pg;
}
/**
 * @brief DefaultPage类的请求退款查询方法
 *
 * 该方法用于创建一个退款查询的请求包，根据用户界面输入的参数
 * 构造一个RefundQuery对象并返回
 *
 * @return QueryPackage* 返回一个指向查询包对象的指针，具体为RefundQuery类型
 */
QueryPackage* DefaultPage::RequestQueryRefund(){
    // 获取用户界面上的开始日期
    QDate txt1 = ui->txt_rf_st->date();
    // 获取用户界面上的结束日期
    QDate txt2 = ui->txt_rf_end->date();
    // 获取用户输入的关键词
    QString key = ui->txt_rf_keyword->text();
    // 判断查询类型，1表示按订单日期查询，0表示其他方式
    int kind = ui->rbtn_rf_orderdate?1:0;
    QString keywordtype;
    if(ui->rbtn_trainid){
        keywordtype = "bytrainid";
    }else if(ui->rbtn_src){
        keywordtype = "bysource";
    }else if(ui->rbtn_dst){
        keywordtype = "bydestination";
    }else{
        keywordtype = "default";
    }
    // 创建并返回一个RefundQuery查询包对象
    QueryPackage* pg = new RefundQuery(0,kind,txt1,txt2,key,keywordtype);
    return pg;
}

/**
 * DefaultPage类的成员函数，用于请求按时查询
 * @return 返回一个OnTimeQuery类型的指针，用于按时查询列车信息
 */
QueryPackage* DefaultPage::RequestQueryOnTime(){
    // 获取是否为夏令时的复选框状态
    //bool isdst = ui->rbtn_ontime_isdst->isChecked();
    // 获取起始站点的当前文本
    QString sta = ui->cmb_ot_sta->currentText();
    // 获取列车ID的当前文本
    QString trainid = ui->cmb_chkp_trainid->currentText();
    // 创建并返回一个新的OnTimeQuery对象
    return new OnTimeQuery(0,sta,trainid);
}
/**
 * @brief DefaultPage类的请求查询检查点方法
 *
 * 该方法用于创建一个CheckPointQuery对象，用于查询检查点信息
 *
 * @return QueryPackage* 返回一个CheckPointQuery指针，包含查询所需的参数
 */
QueryPackage* DefaultPage::RequestQueryChkp(){
    // 获取用户界面中选择的站点信息
    QString sta = ui->cmb_chkp_station->currentText();
    // 获取用户界面中选择的车次ID信息
    QString trainid = ui->cmb_chkp_trainid->currentText();
    // 获取用户界面中选择的日期信息
    QDate dt = ui->date_chkp_tripdate->date();
    // 创建并返回一个新的CheckPointQuery对象，包含上述获取的参数
    return new CheckPointQuery(0,sta,trainid,dt);
}
/**
 * DefaultPage类的请求在售商品查询方法
 * 该方法用于创建并返回一个在售商品查询对象
 *
 * @return 返回一个OnSaleQuery指针，包含查询所需的条件
 */
QueryPackage* DefaultPage::RequestQueryOnSale(){
    // 获取UI界面上销售状态下拉框的当前文本
    QString sta = ui->cmb_sell_sellsta->currentText();
    // 获取UI界面上销售日期选择器的日期
    QDate time = ui->date_sell_selltm->date();
    // 创建并返回一个新的OnSaleQuery对象，传入默认ID0、销售状态和日期
    return new OnSaleQuery(0,sta,time);
}
/**
 * @brief DefaultPage类的槽函数，处理查询请求
 *
 * 当用户点击不同的查询按钮时，此函数会被调用
 * 根据发送信号的对象名称，确定用户想要执行的查询类型
 * 然后创建相应的查询包对象，并通过信号发送出去
 */
void DefaultPage::OnRequestForQuery(){
    // 获取发送信号的对象
    QObject* qsender = sender();
    // 初始化查询包指针为nullptr
    QueryPackage* item = nullptr;
    // 获取发送对象的名称
    QString name = qsender->objectName();
    // 根据按钮名称判断查询类型
    if(name=="btn_onew_query"){  // 单程查询
        item = RequestQueryOneWay();
    }
    if(name=="btn_r_query"){    // 往返查询
        item = RequestQueryRound();
        //emit RequestForQuery(item);
        //break;
    }
    if(name=="btn_s_query"){
        item = RequestQueryTranfer();
    }    // 中转查询
    if(name=="btn_rf_query"){
        item = RequestQueryRefund();
        //break;   // 退票查询
    }
    if(name=="btn_ontime_query"){
        item = RequestQueryOnTime();
        //break; // 准点查询
    }
    if(name=="btn_sell_query"){
        item = RequestQueryOnSale();
        // break;  // 在售查询
    }
    if(name=="btn_chkp_query"){
        item = RequestQueryChkp();
        //break;  // 检票查询
    }
    if(!item){
        qDebug()<<"No Button Detected!";
        // 如果没有检测到有效的按钮
        return;
    }
    emit RequestForQuery(item);
}
// 发送查询请求信号
